From c95e88a596c6f1f15badcca99a1d51c01e28b57b Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 30 Mar 2005 10:57:35 +0000 Subject: [PATCH] bitkeeper revision 1.1236.1.160 (424a861f1fQwwCOgZWaGK3g0CTOOkw) Tidy up vm_assist handling. Signed-off-by: Keir Fraser --- linux-2.4.29-xen-sparse/arch/xen/kernel/head.S | 1 - linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c | 6 ++++-- linux-2.6.11-xen-sparse/arch/xen/i386/kernel/head.S | 1 - linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c | 6 ++++-- linux-2.6.11-xen-sparse/arch/xen/kernel/fixup.c | 8 ++++---- linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c | 11 ++++------- tools/libxc/xc_linux_build.c | 8 -------- tools/libxc/xc_vmx_build.c | 6 ------ xen/arch/x86/dom0_ops.c | 7 +++++++ xen/arch/x86/domain.c | 9 +++++++++ xen/arch/x86/domain_build.c | 4 ---- xen/common/domain.c | 4 ---- xen/common/elf.c | 3 --- xen/common/kernel.c | 1 - xen/include/asm-ia64/config.h | 7 ------- xen/include/asm-x86/mm.h | 8 -------- xen/include/public/arch-x86_32.h | 1 + xen/include/public/arch-x86_64.h | 4 ++-- xen/include/xen/sched.h | 2 -- 19 files changed, 35 insertions(+), 62 deletions(-) diff --git a/linux-2.4.29-xen-sparse/arch/xen/kernel/head.S b/linux-2.4.29-xen-sparse/arch/xen/kernel/head.S index c856a0bd29..e8c563572b 100644 --- a/linux-2.4.29-xen-sparse/arch/xen/kernel/head.S +++ b/linux-2.4.29-xen-sparse/arch/xen/kernel/head.S @@ -2,7 +2,6 @@ .section __xen_guest .ascii "GUEST_OS=linux,GUEST_VER=2.4,XEN_VER=3.0,VIRT_BASE=0xC0000000" .ascii ",LOADER=generic" - .ascii ",PT_MODE_WRITABLE" .byte 0 .text diff --git a/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c b/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c index 5d3529a80a..8fcbf0d720 100644 --- a/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c +++ b/linux-2.4.29-xen-sparse/arch/xen/kernel/setup.c @@ -228,8 +228,10 @@ void __init setup_arch(char **cmdline_p) blk_nohighio = 1; #endif - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_4gb_segments); + HYPERVISOR_vm_assist( + VMASST_CMD_enable, VMASST_TYPE_4gb_segments); + HYPERVISOR_vm_assist( + VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); HYPERVISOR_set_callbacks( __KERNEL_CS, (unsigned long)hypervisor_callback, diff --git a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/head.S b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/head.S index 8b998ea003..74b14017bf 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/head.S +++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/head.S @@ -4,7 +4,6 @@ .section __xen_guest .ascii "GUEST_OS=linux,GUEST_VER=2.6,XEN_VER=3.0,VIRT_BASE=0xC0000000" .ascii ",LOADER=generic" - .ascii ",PT_MODE_WRITABLE" .byte 0 .text diff --git a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c index 8cd00c343e..5723ed21c4 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c +++ b/linux-2.6.11-xen-sparse/arch/xen/i386/kernel/setup.c @@ -1409,8 +1409,10 @@ void __init setup_arch(char **cmdline_p) /* Register a call for panic conditions. */ notifier_chain_register(&panic_notifier_list, &xen_panic_block); - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_4gb_segments); + HYPERVISOR_vm_assist( + VMASST_CMD_enable, VMASST_TYPE_4gb_segments); + HYPERVISOR_vm_assist( + VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); early_cpu_init(); diff --git a/linux-2.6.11-xen-sparse/arch/xen/kernel/fixup.c b/linux-2.6.11-xen-sparse/arch/xen/kernel/fixup.c index 01fe5df942..017f215cf8 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/kernel/fixup.c +++ b/linux-2.6.11-xen-sparse/arch/xen/kernel/fixup.c @@ -50,8 +50,8 @@ __LINKAGE void do_fixup_4gb_segment(struct pt_regs *regs, long error_code) if ( !test_and_set_bit(0, &printed) ) { - HYPERVISOR_vm_assist(VMASST_CMD_disable, - VMASST_TYPE_4gb_segments_notify); + HYPERVISOR_vm_assist( + VMASST_CMD_disable, VMASST_TYPE_4gb_segments_notify); DP(""); DP("***************************************************************"); @@ -79,8 +79,8 @@ __LINKAGE void do_fixup_4gb_segment(struct pt_regs *regs, long error_code) static int __init fixup_init(void) { - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_4gb_segments_notify); + HYPERVISOR_vm_assist( + VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify); return 0; } __initcall(fixup_init); diff --git a/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c b/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c index 37c70d26da..f544ce4e96 100644 --- a/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c +++ b/linux-2.6.11-xen-sparse/arch/xen/kernel/reboot.c @@ -110,18 +110,15 @@ static void __do_suspend(void) HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; clear_fixmap(FIX_SHARED_INFO); - memcpy(&suspend_record->resume_info, &xen_start_info, sizeof(xen_start_info)); + memcpy(&suspend_record->resume_info, &xen_start_info, + sizeof(xen_start_info)); HYPERVISOR_suspend(virt_to_machine(suspend_record) >> PAGE_SHIFT); - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_4gb_segments); - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_writable_pagetables); - shutting_down = -1; - memcpy(&xen_start_info, &suspend_record->resume_info, sizeof(xen_start_info)); + memcpy(&xen_start_info, &suspend_record->resume_info, + sizeof(xen_start_info)); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) set_fixmap_ma(FIX_SHARED_INFO, xen_start_info.shared_info); diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index 919800c108..5e3d474ab0 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -22,7 +22,6 @@ struct domain_setup_info unsigned long v_kernend; unsigned long v_kernentry; - unsigned int use_writable_pagetables; unsigned int load_bsd_symtab; unsigned long symtab_addr; @@ -88,10 +87,6 @@ static int setup_guest(int xc_handle, if ( rc != 0 ) goto error_out; - if (dsi.use_writable_pagetables) - xc_domain_setvmassist(xc_handle, dom, VMASST_CMD_enable, - VMASST_TYPE_writable_pagetables); - if (dsi.load_bsd_symtab) loadelfsymtab(image, xc_handle, dom, NULL, &dsi); @@ -580,9 +575,6 @@ static int parseelfimage(char *elfbase, if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL ) dsi->v_start = strtoul(p+10, &p, 0); - if ( (p = strstr(guestinfo, "PT_MODE_WRITABLE")) != NULL ) - dsi->use_writable_pagetables = 1; - if ( (p = strstr(guestinfo, "BSD_SYMTAB")) != NULL ) dsi->load_bsd_symtab = 1; diff --git a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c index 8ef871c9c4..b1937b76ba 100644 --- a/tools/libxc/xc_vmx_build.c +++ b/tools/libxc/xc_vmx_build.c @@ -27,7 +27,6 @@ struct domain_setup_info unsigned long v_kernend; unsigned long v_kernentry; - unsigned int use_writable_pagetables; unsigned int load_bsd_symtab; unsigned long symtab_addr; @@ -198,10 +197,6 @@ static int setup_guest(int xc_handle, if ( rc != 0 ) goto error_out; - if (dsi.use_writable_pagetables) - xc_domain_setvmassist(xc_handle, dom, VMASST_CMD_enable, - VMASST_TYPE_writable_pagetables); - if (dsi.load_bsd_symtab) loadelfsymtab(image, xc_handle, dom, NULL, &dsi); @@ -708,7 +703,6 @@ static int parseelfimage(char *elfbase, } dsi->v_start = 0x00000000; - dsi->use_writable_pagetables = 0; dsi->load_bsd_symtab = 0; dsi->v_kernstart = kernstart - LINUX_PAGE_OFFSET; diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c index 27074f1cc8..4cc72159be 100644 --- a/xen/arch/x86/dom0_ops.c +++ b/xen/arch/x86/dom0_ops.c @@ -435,8 +435,15 @@ void arch_getdomaininfo_ctxt( memcpy(c->debugreg, ed->arch.debugreg, sizeof(ed->arch.debugreg)); +#if defined(__i386__) c->event_callback_cs = ed->arch.event_selector; c->event_callback_eip = ed->arch.event_address; c->failsafe_callback_cs = ed->arch.failsafe_selector; c->failsafe_callback_eip = ed->arch.failsafe_address; +#elif defined(__x86_64__) + c->event_callback_eip = ed->arch.event_address; + c->failsafe_callback_eip = ed->arch.failsafe_address; + c->syscall_callback_eip = ed->arch.syscall_address; +#endif + c->vm_assist = ed->domain->vm_assist; } diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index e26a509f2a..a53f4c09fb 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -494,10 +494,19 @@ int arch_set_info_guest( for ( i = 0; i < 8; i++ ) (void)set_debugreg(ed, i, c->debugreg[i]); +#if defined(__i386__) ed->arch.event_selector = c->event_callback_cs; ed->arch.event_address = c->event_callback_eip; ed->arch.failsafe_selector = c->failsafe_callback_cs; ed->arch.failsafe_address = c->failsafe_callback_eip; +#elif defined(__x86_64__) + ed->arch.event_address = c->event_callback_eip; + ed->arch.failsafe_address = c->failsafe_callback_eip; + ed->arch.syscall_address = c->syscall_callback_eip; +#endif + + if ( ed->eid == 0 ) + d->vm_assist = c->vm_assist; phys_basetab = c->pt_base; ed->arch.guest_table = ed->arch.phys_table = mk_pagetable(phys_basetab); diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 3ad344ce09..5e8c8a509a 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -129,10 +129,6 @@ int construct_dom0(struct domain *d, if ( rc != 0 ) return rc; - /* Set up domain options */ - if ( dsi.use_writable_pagetables ) - vm_assist(d, VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); - /* Align load address to 4MB boundary. */ dsi.v_start &= ~((1UL<<22)-1); diff --git a/xen/common/domain.c b/xen/common/domain.c index 54b67cb95f..cc3c5bf917 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -358,13 +358,9 @@ long vm_assist(struct domain *p, unsigned int cmd, unsigned int type) { case VMASST_CMD_enable: set_bit(type, &p->vm_assist); - if (vm_assist_info[type].enable) - (*vm_assist_info[type].enable)(p); return 0; case VMASST_CMD_disable: clear_bit(type, &p->vm_assist); - if (vm_assist_info[type].disable) - (*vm_assist_info[type].disable)(p); return 0; } diff --git a/xen/common/elf.c b/xen/common/elf.c index 74f1609392..3ee170b453 100644 --- a/xen/common/elf.c +++ b/xen/common/elf.c @@ -118,9 +118,6 @@ int parseelfimage(char *elfbase, { if ( (p = strstr(guestinfo, "VIRT_BASE=")) != NULL ) dsi->v_start = simple_strtoul(p+10, &p, 0); - - if ( (p = strstr(guestinfo, "PT_MODE_WRITABLE")) != NULL ) - dsi->use_writable_pagetables = 1; } dsi->v_kernstart = kernstart; diff --git a/xen/common/kernel.c b/xen/common/kernel.c index c6e7c213d8..e27a10a76b 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -75,7 +75,6 @@ long do_xen_version(int cmd) return (XEN_VERSION<<16) | (XEN_SUBVERSION); } -vm_assist_info_t vm_assist_info[MAX_VMASST_TYPE + 1]; long do_vm_assist(unsigned int cmd, unsigned int type) { return vm_assist(current->domain, cmd, type); diff --git a/xen/include/asm-ia64/config.h b/xen/include/asm-ia64/config.h index c2b831a978..3d4dfec45e 100644 --- a/xen/include/asm-ia64/config.h +++ b/xen/include/asm-ia64/config.h @@ -51,13 +51,6 @@ extern unsigned long xenheap_size; // from linux/include/linux/mm.h extern struct page *mem_map; -// defined in include/asm-x86/mm.h, not really used for ia64 -typedef struct { - void (*enable)(struct domain *p); - void (*disable)(struct domain *p); -} vm_assist_info_t; -extern vm_assist_info_t vm_assist_info[]; - // xen/include/asm/config.h extern char _end[]; /* standard ELF symbol */ diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index 17357bbcb4..2831138fb0 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -246,14 +246,6 @@ void memguard_unguard_range(void *p, unsigned long l); #define memguard_unguard_range(_p,_l) ((void)0) #endif - -typedef struct { - void (*enable)(struct domain *); - void (*disable)(struct domain *); -} vm_assist_info_t; -extern vm_assist_info_t vm_assist_info[]; - - /* Writable Pagetables */ typedef struct { /* Linear address where the guest is updating the p.t. page. */ diff --git a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h index cc711b209c..1ca884f2fe 100644 --- a/xen/include/public/arch-x86_32.h +++ b/xen/include/public/arch-x86_32.h @@ -140,6 +140,7 @@ typedef struct { unsigned long event_callback_eip; unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ unsigned long failsafe_callback_eip; + unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ } PACKED full_execution_context_t; typedef struct { diff --git a/xen/include/public/arch-x86_64.h b/xen/include/public/arch-x86_64.h index c00cba62ce..2a6c44d417 100644 --- a/xen/include/public/arch-x86_64.h +++ b/xen/include/public/arch-x86_64.h @@ -190,10 +190,10 @@ typedef struct { unsigned long kernel_ss, kernel_esp; /* Virtual TSS (only SS1/ESP1) */ unsigned long pt_base; /* CR3 (pagetable base) */ unsigned long debugreg[8]; /* DB0-DB7 (debug registers) */ - unsigned long event_callback_cs; /* CS:EIP of event callback */ unsigned long event_callback_eip; - unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback */ unsigned long failsafe_callback_eip; + unsigned long syscall_callback_eip; + unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ } PACKED full_execution_context_t; typedef struct { diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index b28a955b0f..c0567d8f28 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -155,8 +155,6 @@ struct domain_setup_info unsigned long v_kernstart; unsigned long v_kernend; unsigned long v_kernentry; - - unsigned int use_writable_pagetables; }; #include /* for KERNEL_DS */ -- 2.30.2